package com.tensquare.user.interceptor;

import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import util.JwtUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 我们和客户端商量好 token的方式
 * token写在每次请求的请求头中
 * 以 Authorization: Bearer+空格+token
 * 这样的形式传入到后端
 *
 * 设置拦截器是为了我们不需要在每一次请求的Controller代码中都写上解密token的流程
 * 我们将解密token的流程,以拦截器的形式拦截每一次请求,从请求中解密token信息,获取
 * 我们需要的信息(用户角色),并且将信息存入本次请求的请求域中,被请求调用的Controller
 * 从本次请求的请求域中获取客户端用的角色身份
 */
@Component
//拦截器  =>  抽取从request中token的代码
public class JwtInterceptor  extends HandlerInterceptorAdapter{
    @Autowired
    private JwtUtil jwtUtil;

    @Override
    //在controller方法执行前,先执行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1.获得Authorization的头内容(token)
        String authorizationHeader = request.getHeader("Authorization");
        //2.判断是否存在该请求头并以"Bearer "开头
        if (!StringUtils.isEmpty(authorizationHeader) && authorizationHeader.startsWith("Bearer ")) {
            //3.截掉"Bearer "部分 解析token
                   //0123456    7是指引子字符串开始索引
            String token = authorizationHeader.substring(7);
            Claims claims = jwtUtil.parserToken(token);

            //解析出用户信息
            if (claims != null) {
                //将用户信息放入request域中
                String role = (String) claims.get("role");

                //claims_admin管理员   claims_user普通用户  向请求域中添加权限
                request.setAttribute("claims_"+role,claims);

                System.out.println("将Jwt载荷信息放入到request域中"+"claims_"+role);
            }
        }

        //放行
        return true;

    }
}